// Copyright 2017, 2019 ETH Zürich, Thomas Schöps
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice,
//    this list of conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice,
//    this list of conditions and the following disclaimer in the documentation
//    and/or other materials provided with the distribution.
//
// 3. Neither the name of the copyright holder nor the names of its contributors
//    may be used to endorse or promote products derived from this software
//    without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.


#include "libvis/libvis.h"

#include <thread>

#ifdef LIBVIS_HAVE_QT
#include <QApplication>
#include <QSurfaceFormat>
#endif

#include "libvis/logging.h"
#include "libvis/qt_thread.h"

namespace vis {

LibvisApplication::LibvisApplication(int argc, char** argv) {
  // HACK before a solution is found to export loguru's symbols in Windows.
  // This means that on Windows, loguru uses the default format.
#ifndef WIN32
  loguru::g_preamble_date = false;
  loguru::g_preamble_thread = false;
  loguru::g_preamble_uptime = false;
  loguru::g_stderr_verbosity = 2;
#endif
  if (argc > 0) {
    loguru::init(argc, argv, /*verbosity_flag*/ nullptr);
  }
}

void LibvisApplication::SetDefaultQSurfaceFormat() {
  // QSurfaceFormat default settings should be set before the QApplication is constructed.
  // TODO: These settings here should be configurable by the application!
  QSurfaceFormat surface_format;
  surface_format.setVersion(4, 4);
  surface_format.setProfile(QSurfaceFormat::CompatibilityProfile);
  surface_format.setSamples(4);
  surface_format.setAlphaBufferSize(0);
  QSurfaceFormat::setDefaultFormat(surface_format);
}

int LibvisApplication::WrapQtEventLoopAround(int (*func)(int, char**), int argc, char** argv) {
  return vis::WrapQtEventLoopAround(func, argc, argv);
}

}
